package observer;

import java.util.ArrayList;
import java.util.List;

/**
 * 官方点的定义:
 *   ObserverPattern 定义对象间的一种一对多依赖关系,
 *   使得每当一个对象状态发生改变时, 其依赖对象皆得到通知并自动更新;
 *
 * 1. 简单介绍一下观察者模式的定义，是为了做什么的 ?
 *
 *      抽象以下情景: 当多个对象依赖一个对象的通知/状态时, 这个对象状态好了后通知多个对象;
 *
 *      比如手机厂商们都依赖 高通的芯片;
 *      那厂商们不知道芯片什么时候好, 就有时没事就骚扰问问高通, 这会让双方都觉得浪费时间不舒服;
 *      那么他们就约定, 手机厂商们都不问了, 高通做好芯片后会立刻通知手机厂商们;
 *
 * 2. 有什么实例没有 ?
 *     在代码, JDK 等地方中暂时没找到
 *
 * 3. 优缺点是什么 ?
 *  优点: 觉得这样抽象挺好的, 不然像例子里的张三李四就会不断, 间歇性的问王五, 浪费大家的时间;(理解的好浅啊哈哈哈)
 *
 */

/**
 * 张三, 李四, 王五是朋友;
 * 如果王五有空了, 会通知其他朋友们一起出来玩;
 */
public class ObserverPattern {
    public static void main(String[] args) {
        Friend wangWu = new Friend();
        wangWu.addOtherFriend(new ZhangSan());
        wangWu.addOtherFriend(new LiSi());
        wangWu.setNowFree();
    }
}

class Friend {
    private List<Observer> observers = new ArrayList<Observer>();
    private int freeState;

    public void setNowFree() {
        this.freeState = 1;
        notifyAllOtherFriend();
    }

    public void addOtherFriend(Observer observer) {
        observers.add(observer);
    }

    public void notifyAllOtherFriend() {
        for (Observer observer : observers) {
            observer.observeSubject();
        }
    }
}

interface Observer {
    public void observeSubject();
}

class ZhangSan implements Observer {
    @Override
    public void observeSubject() {
        System.out.println("张三 收到，会出来玩");
    }
}

class LiSi implements Observer {
    @Override
    public void observeSubject() {
        System.out.println("李四 收到，会出来玩");
    }
}